package com.xzzz.irda.auth.core.authorization;


import com.xzzz.irda.auth.core.constants.GrantTypeEnum;
import com.xzzz.irda.auth.core.token.AccessToken;

import java.util.Date;
import java.util.List;

/**
 * 授权类型
 * @see GrantTypeEnum
 *
 * @author wangyf
 * 
 */
public interface Authorization {

    // --------------------< 授权对象参数 >--------------------

    /**
     * 授权类型
     * @return grantType {@link GrantTypeEnum}
     */
    String getGrantType();

    /**
     * 设置授权主题的类型
     * @param grantType {@link GrantTypeEnum}
     */
    void setGrantType(String grantType);

    /**
     * 设置客户端类型
     * @param clientId 类型
     */
    void setClientId(String clientId);

    /**
     * 获取客户端类型
     * @return 客户端类型
     */
    String getClientId();

    /**
     * 授权到期倒数,单位秒
     * @return 到期秒数
     */
    Long getExpire();

    /**
     * 设置到期秒数
     * @param expire expire
     */
    void setExpire(Long expire);

    /**
     * 到期时间戳
     * @see System#currentTimeMillis()
     * @return 到期时间戳
     */
    Long getExpireTime();

    /**
     * 到期时间戳
     * @param expireTime 到期时间戳
     */
    void setExpireTime(Long expireTime);

    /**
     * 授权有效时长(单位秒)
     * @return 授权有效时长
     */
    Long getDuration();

    /**
     * 授权有效时长
     * @param duration 授权有效时长
     */
    void setDuration(Long duration);

    /**
     * 获取登录日期
     * @return 日期
     */
    Date getLoginDateTime();

    /**
     * 设置登录日期
     * @param loginDateTime 日期
     */
    void setLoginDateTime(Date loginDateTime);

    /**
     * token中配置是否需要刷新token
     * @return true:需要刷新; false:不需要刷新;
     */
    Boolean getRequestRefresh();

    /**
     * 设置是否刷新token标识
     * @param requestRefresh 是否刷新token
     */
    void setRequestRefresh(Boolean requestRefresh);

    // --------------------< Token >--------------------

    /**
     * 获取 token
     * @return token
     */
    AccessToken getAccessToken();

    /**
     * 设置 token
     * @param token token
     */
    void setAccessToken(AccessToken token);

    // --------------------< 权限列表 >--------------------
    /**
     * 获取权限列表
     * @return 权限列表
     */
    List<String> getPermissions ();

    /**
     * 设置权限集合
     * @param permissions 权限列表
     */
    void setPermissions (List<String> permissions);
}

